package main

import (
	"fmt"
	"strconv"
)

/*
把数字翻译成字符串
给定一个数字，我们按照如下规则把它翻译为字符串：0 翻译成 “a” ，1 翻译成 “b”，……，11 翻译成 “l”，……，25 翻译成 “z”。
一个数字可能有多个翻译。请编程实现一个函数，用来计算一个数字有多少种不同的翻译方法。

示例 1:
输入: 12258
输出: 5
解释: 12258有5种不同的翻译，分别是"bccfi", "bwfi", "bczi", "mcfi"和"mzi"
*/

func translateNum(num int) int {
	// 动态规划，参考爬楼梯
	// dp[i]表示以str[i]结尾，有多少种解法
	if num < 10 {
		return 1
	}
	if num >= 10 && num <= 25 {
		return 2
	}
	int2Str := strconv.Itoa(num)
	dp := make([]int, len(int2Str))
	dp[0] = 1 // 初始化
	if int2Str[:2] >= "10" && int2Str[:2] <= "25" {
		dp[1] = 2
	} else {
		dp[1] = 1
	}
	for i := 2; i < len(int2Str); i++ {
		newNum := int2Str[i-1 : i+1]
		// 递推公式
		if newNum >= "10" && newNum <= "25" {
			dp[i] = dp[i-1] + dp[i-2]
		} else {
			dp[i] = dp[i-1]
		}
	}
	return dp[len(int2Str)-1]
}

func main() {
	fmt.Println(translateNum(22))
}
